<?php
namespace app\common\utils;

use think\exception\InvalidArgumentException;

class AmisUploadValidator
{
    /**
     * 读取配置并生成验证规则
     * @param string $type 类型：'image'（对应input-image）或 'file'（对应input-file）
     * @return array 验证规则数组（格式：['字段名' => '规则1|规则2']）
     * @throws InvalidArgumentException
     */
    public static function getRules(string $type): array
    {
        // 读取配置文件
        $config = config('lhp.upload.' . $type);
        if (empty($config)) {
            throw new InvalidArgumentException("不存在的上传类型：{$type}，请检查配置文件");
        }

        // 组装验证规则
        $rules = [];

        // 1. 文件大小验证（Amis的maxSize转换，单位：KB转字节）
        if (!empty($config['max_size'])) {
            $maxSizeBytes = $config['max_size'] * 1024; // 转换为字节
            $rules[] = "fileSize:{$maxSizeBytes}";
        }

        // 2. 文件后缀验证（对应Amis的accept）
        if (!empty($config['allowed_exts'])) {
            $exts = is_array($config['allowed_exts'])
                ? implode(',', $config['allowed_exts'])
                : $config['allowed_exts'];
            $rules[] = "fileExt:{$exts}";
        }

        // 3. MIME类型验证（比后缀更严格，防止伪装文件）
        if (!empty($config['allowed_mimes'])) {
            $mimes = is_array($config['allowed_mimes'])
                ? implode(',', $config['allowed_mimes'])
                : $config['allowed_mimes'];
            $rules[] = "fileMime:{$mimes}";
        }

        // 4. 图片特有验证（仅input-image需要，对应Amis的尺寸限制）
        if ($type === 'image' && !empty($config['image_dimension'])) {
            $dim = $config['image_dimension'];
            $width = $dim['max_width'] ?? '';
            $height = $dim['max_height'] ?? '';
            $minWidth = $dim['min_width'] ?? '';
            $minHeight = $dim['min_height'] ?? '';

            // 图片尺寸规则：image:最大宽,最大高,最小宽,最小高,允许的后缀
            $imageRule = "image:{$width},{$height},{$minWidth},{$minHeight}";
            if (!empty($config['allowed_exts'])) {
                $imageRule .= "," . $config['allowed_exts'];
            }
            $rules[] = $imageRule;
        }

        // 返回规则（默认字段名与类型一致，可根据实际表单字段修改）
        return [
            $type => implode('|', $rules)
        ];
    }

    /**
     * 执行验证
     * @param string $type 类型：'image' 或 'file'
     * @param array $files 上传的文件（来自request()->file()）
     * @return bool 验证通过返回true，失败抛出异常
     * @throws \think\exception\ValidateException
     */
    public static function validate(string $type, array $files): bool
    {
        $rules = self::getRules($type);
        // 使用ThinkPHP的验证器执行验证
        validate($rules)->check($files);
        return true;
    }
}